// 如何在函数执行时绑定this

// const obj = {x: 100, fn() {this.x}}
// 执行obj.fn(), 此时fn内部的this就指向 obj
// 借此来绑定this


// @ts-ignore
Function.prototype.customCall = function(context: any, ...args: any[]) {
  if(context == null) context = globalThis
  if(typeof context !== 'object') context = new Object(context) // 值类型 变为对象

  const fnKey = Symbol() // 不会出现属性名称的污染
  context[fnKey] = this // this就是当前的函数

  const res = context[fnKey](...args) // 绑定了 this
  delete context[fnKey] // 清理掉 fn， 防止污染
  return res 
}



// @ts-ignore
Function.prototype.customApply = function(context: any, ...args: any[] = []) {
  if(context == null) context = globalThis
  if(typeof context !== 'object') context = new Object(context) // 值类型 变为对象

  const fnKey = Symbol() // 不会出现属性名称的污染
  context[fnKey] = this // this就是当前的函数

  const res = context[fnKey](...args) // 绑定了 this
  delete context[fnKey] // 清理掉 fn， 防止污染
  return res 
}